from pydantic import Field

from src.agent.mcp import MCPAgent
from src.prompt.mcp import NEXT_STEP_PROMPT_ZN
from src.prompt.report import REPORT_SYSTEM_PROMPT
from src.tool import Terminate, ToolCollection
from src.tool.create_html import CreateHtmlTool


class ReportAgent(MCPAgent):
    """报告生成代理：综合其他专业代理的洞察生成全面报告。

    这个代理专门设计用于报告生成任务，具有以下特点：
    1. 继承自 MCPAgent，具备完整的工具调用能力
    2. 专门针对报告生成进行优化的提示词系统
    3. 内置 HTML 报告生成工具
    4. 支持中文界面和提示

    主要功能：
    - 综合分析来自多个专业代理的数据和洞察
    - 生成结构化的 HTML 格式报告
    - 支持多种报告类型（金融分析、技术分析、风险评估等）
    - 自动格式化和美化报告内容
    - 支持图表、表格等丰富的展示形式

    适用场景：
    - 金融分析报告生成
    - 投资研究报告编制
    - 市场分析报告创建
    - 综合性研究报告输出
    """

    # 代理基本配置
    name: str = Field(default="report_agent", description="报告生成代理名称")
    description: str = Field(
        default="通过综合其他专业代理的洞察生成全面报告的智能代理",
        description="代理功能描述"
    )
    system_prompt: str = Field(
        default=REPORT_SYSTEM_PROMPT, description="报告生成专用系统提示词"
    )
    next_step_prompt: str = Field(
        default=NEXT_STEP_PROMPT_ZN, description="中文步骤指导提示词"
    )

    # 工具配置：专门为报告生成优化的工具集合
    available_tools: ToolCollection = Field(
        default_factory=lambda: ToolCollection(
            CreateHtmlTool(),  # HTML 报告生成工具
            Terminate(),       # 任务终止工具
        ),
        description="报告生成专用工具集合，包含 HTML 生成和任务控制工具"
    )
    special_tool_names: list[str] = Field(
        default_factory=lambda: [Terminate().name],
        description="特殊工具名称列表，用于状态管理"
    )


if __name__ == "__main__":
    """报告代理的示例使用程序。
    
    这个示例展示了如何创建和使用 ReportAgent 来生成 HTML 格式的报告。
    可以作为测试代理功能或开发调试的起点。
    """
    import asyncio

    async def run_agent():
        """运行报告代理的示例函数。
        
        演示完整的代理创建、初始化和执行流程：
        1. 创建 ReportAgent 实例
        2. 初始化代理和工具
        3. 执行报告生成任务
        """
        # 创建并初始化报告代理
        agent = await ReportAgent.create()
        await agent.initialize()
        
        # 定义报告生成任务
        prompt = "生成一个关于 AI 发展趋势的综合性分析报告，HTML 格式"
        
        # 执行报告生成
        await agent.run(prompt)

    # 运行示例程序
    asyncio.run(run_agent())
